package com.practice;

/**
 * @author YJ
 * @data 2025/6/11 16:53
 */
public class ReverseOrderPair {
    int[] nums,temp;

    /**
     * 在数组中的两个数字，如果前面一个数字大于后面的数字，则这两个数字组成一个逆序对。
     * 输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。
     * 即输出P mod 1000000007
     */
    public int InversePairs (int[] nums) {
        // write code here
        nums = nums;
        temp = new int[nums.length];
        return merge_sort(0,nums.length-1);
    }

    public int merge_sort(int l,int r){
        if(l>=r)return 0;
        int m, i, j, k;
        long res;

        m = (l+r)/2;
        res = (merge_sort(l,m)+merge_sort(m+1,r))%1000000007;

        //merge
        for(k=l;k<=r;k++)temp[k]=nums[k];
        i = l;j = m+1;k = l;
        for(k=l;k<=r;k++){
            if(i==m+1)nums[k]=temp[j++];
            else if(j==r+1||temp[i]<=temp[j])nums[k] = temp[i++];
            else {
                res=(res + m-i+1)%1000000007;
                nums[k]=temp[j++];
            }
        }
        return (int)res;
    }
}
